package com.fengdao.demo.config;


import io.swagger.v3.oas.annotations.ExternalDocumentation;
import io.swagger.v3.oas.annotations.OpenAPIDefinition;
import io.swagger.v3.oas.annotations.enums.SecuritySchemeIn;
import io.swagger.v3.oas.annotations.enums.SecuritySchemeType;
import io.swagger.v3.oas.annotations.info.Contact;
import io.swagger.v3.oas.annotations.info.Info;
import io.swagger.v3.oas.annotations.info.License;
import io.swagger.v3.oas.annotations.security.SecurityRequirement;
import io.swagger.v3.oas.annotations.security.SecurityScheme;
import io.swagger.v3.oas.annotations.servers.Server;
import org.apache.commons.lang3.StringUtils;
import org.springdoc.core.GroupedOpenApi;
import org.springdoc.core.customizers.OpenApiCustomiser;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

import java.util.Comparator;
import java.util.stream.Collectors;

/**
 * <pre>
 *     https://www.cnblogs.com/antLaddie/p/17418078.html
 *     两种方式：
 *     方法一：配置SwaggerOpenApiConfig（注解方式）： @OpenAPIDefinition
 *     方法二： 配置OpenApiConfig（配置类方式）
 *
 * </pre>
 * @author Administrator
 */
@SecurityScheme(type = SecuritySchemeType.APIKEY, name = "Authorization", scheme = "Authorization", in = SecuritySchemeIn.HEADER)
@OpenAPIDefinition(security = @SecurityRequirement(name = "Authorization"),
        // ## API的基本信息，包括标题、版本号、描述、联系人等
        info = @Info(
                title = "Swagger3.0 (Open API) 框架学习示例文档",       // Api接口文档标题（必填）
                description = "学习Swagger框架而用来定义测试的文档",      // Api接口文档描述
                version = "V1.0",                                   // Api接口版本
                termsOfService = "http://localhost:8085/openapi3-mail/doc.html",             // Api接口的服务条款地址 // swagger-ui/index.html 页面才能看到
                contact = @Contact(
                        name = "枫叨",                            // 作者名称
                        email = "1245064718@qq.com",              // 作者邮箱
                        url = "https://gitee.com/banyuesong"  // 介绍作者的URL地址 // swagger-ui/index.html 页面才能看到
                ),
                license = @License(                                                // 设置联系人信息
                        name = "Apache 2.0",                                       // 授权名称
                        url = "https://www.apache.org/licenses/LICENSE-2.0.html"   // 授权信息 // swagger-ui/index.html 页面才能看到
                )
        ),
        // ## 表示服务器地址或者URL模板列表，多个服务地址随时切换（只不过是有多台IP有当前的服务API）
        servers = {
                @Server(url = "http://localhost:8085/openapi3-mail/", description = "本地服务器一服务"), // swagger-ui/index.html 页面才能看到
                @Server(url = "http://localhost:8085/openapi3-mail/", description = "本地服务器二服务"),
        },
        externalDocs = @ExternalDocumentation(description = "更多内容请查看该链接", url = "https://gitee.com/banyuesong") // swagger-ui/index.html 页面才能看到
)
@Configuration
public class OpenApiConfig {
    private final String title = "Knife4j OpenApi 3";
    private static final String TOKEN_HEADER = "Authorization";

    //@Bean
    //public OpenAPI springOpenAPI() {
    //
    //    //Info info = new Info()
    //    //        .title("这是文档标题")
    //    //        .description("这是文档描述")
    //    //        // 接口文档版本
    //    //        .version("v1.0")
    //    //        // 开发者联系方式
    //    //        .contact(new Contact().name("fengdao").email("邮箱").url("https://gitee.com/banyuesong"))
    //    //        // 参考 Apache 2.0 许可及地址，你可以不配此项
    //    //        .license(new License().name("Apache 2.0").url("https://www.apache.org/licenses/LICENSE-2.0.html"));
    //
    //
    //    // 引入外部的文档，我这里引得是 springdoc 官方文档地址，可以不配此项,TODO :页面也没展示，配置了也没用
    //    ExternalDocumentation externalDocs = new ExternalDocumentation()
    //            // 额外补充说明
    //            .description("Github example code")
    //            // 额外补充链接
    //            .url("https://gitee.com/banyuesong");
    //    return new OpenAPI()
    //            // 接口文档标题
    //            //.info(info)
    //            .externalDocs(externalDocs);
    //
    //}

    /**
     * GroupedOpenApi 是对接口文档分组，类似于 swagger 的 Docket
     *
     * @return
     */
    @Bean
    public GroupedOpenApi publicApi() {
        return GroupedOpenApi.builder()
                // 组名
                .group("default2")
                // 扫描的路径，支持通配符
                .pathsToMatch("/**")
                // 扫描的包
                .packagesToScan("com.fengdao.demo")
                //添加自定义规则
                //.addOpenApiCustomiser(sortTagsAlphabetically())
                .build();
    }

    /**
     * 排序规则方法，Controller 排序, TODO :并不生效
     *
     * @return
     */
    public OpenApiCustomiser sortTagsAlphabetically() {
        return openApi -> openApi.setTags(openApi.getTags()
                .stream()
                .sorted(Comparator.comparing(tag -> StringUtils.stripAccents(tag.getDescription())))
                .collect(Collectors.toList()));
    }

}